// zlib 模块提供了对数据压缩和解压缩的功能,无损压缩
const zlib = require('node:zlib')
const fs = require('node:fs')
const http = require('node:http')

// zlib.createGzip() 是进行 gz的压缩，压缩完会明显的缩小
// 三行代码完成压缩
// const readStream = fs.createReadStream('index.txt')  // 创建可读流
// const writeStream = fs.createWriteStream('index.txt.gz')  // 创建写入流，文件名是.gz后缀
// readStream.pipe(zlib.createGzip()).pipe(writeStream)         // pipe是流管道，处理流的，进行转换

// 解压缩 zlib.createGunzip()     (Gzip|Gunzip)
// const readStream = fs.createReadStream('index.txt.gz')
// const writeStream = fs.createWriteStream('index2.txt')  
// readStream.pipe(zlib.createGunzip()).pipe(writeStream)  

// 另一个压缩算法 deflate
// const readStream = fs.createReadStream('index.txt')  
// const writeStream = fs.createWriteStream('index.txt.deflate')   // 后缀要改成 .deflate
// readStream.pipe(zlib.createDeflate()).pipe(writeStream)   

// 对应的解压缩 zlib.createInflate()  
const readStream = fs.createReadStream('index.txt.deflate')
const writeStream = fs.createWriteStream('index3.txt')  
readStream.pipe(zlib.createInflate()).pipe(writeStream)  


/*
gzip 和 deflate 区别
    压缩算法：Gzip 使用的压缩算法，结合了 LZ77 算法和哈夫曼编码。LZ77 算法用于数据的重复字符串的替换和引用，而哈夫曼编码用于进一步压缩数据。
    压缩效率：Gzip 压缩通常具有更高的压缩率，因为它使用了哈夫曼编码来进一步压缩数据。哈夫曼编码根据字符的出现频率，将较常见的字符用较短的编码表示，从而减小数据的大小。
    压缩速度：相比于仅使用 Deflate 的方式，Gzip 压缩需要更多的计算和处理时间，因为它还要进行哈夫曼编码的步骤。因此，在压缩速度方面，Deflate 可能比 Gzip 更快。
    应用场景：Gzip 压缩常用于文件压缩、Deflate用于网络传输和 HTTP 响应的内容编码。它广泛应用于 Web 服务器和浏览器之间的数据传输，以减小文件大小和提高网络传输效率。
*/


// 演示在请求中压缩
const server = http.createServer((req, res) => {
    const text = 'xmzs'.repeat(1000)     // 重复1000次的方法
    // res.setHeader("Content-Encodeing", "gzip")  // 设置响应的头部，文本解析方式是 gzip，浏览器是能解析这种压缩文本的
    res.setHeader("Content-Encodeing", "deflate") 
    res.setHeader("Content-type", "text/plain;chartset=utf-8")
    // res.end(text)  // 返回给前端
    // 进行压缩
    // let result = zlib.gzipSync(text)
    let result = zlib.deflateSync(text)
    res.end(result)
})

server.listen(3000, () => {
    console.log('启动成功');
})